﻿Shader "Unlit/005_02Grabpass"
{
   Properties
    {
       _DistortStrength("DistortStrength",range(0,1))=0.2 
       _DistorTimeFactor("DistorTimeFactor",range(0,1))=1
       _NoiseTex("NoiseTex",2D)="White"{}
    }
    SubShader
    {
        ZWrite Off
        Cull Off
        GrabPass
        {
             //此处给出一个抓屏贴图的名称，抓屏的贴图就可以通过这张贴图来获取，而且每一帧不管有多个物体使用了该shader，只会有一个进行抓屏操作
            //如果此处为空，则默认抓屏到_GrabTexture中，但是据说每个用了这个shader的都会进行一次抓屏
            "_GrabTempTex"
        }
        
        Pass
        {
            Tags{
                "RenderType" = "Transparent"
                "Queue" = "Transparent+100"
            }
            CGPROGRAM
            
            
            #include "UnityCG.cginc"
            
            #pragma vertex  vert
            #pragma fragment  frag
            
            sampler2D _GrabTempTex;
            float4 _GrabTempTex_ST;
            
            sampler2D _NoiseTex;
            float4 _NoiseTex_ST;
            
            float _DistortStrength;
            float _DistorTimeFactor;
            
            struct v2f
            {
                float4 pos : SV_POSITION;
                float4 grabPos : TEXCOORDO;
                float2 uv : TEXCOORD1;
            };
            
            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                //计算抓屏的位置，其中主要是将坐标从（-1,1）转化到（0,1）空间并处理DX和GL纹理反向问题
                o.grabPos = ComputeGrabScreenPos(o.pos);
                o.uv = TRANSFORM_TEX(v.texcoord , _NoiseTex);
                
                return o;
            
            }
            
            fixed4 frag(v2f i):SV_Target
            {
            //首先采样噪声图，采样uv值随时间连续变换，而输出一个噪声图中的随机值，乘上一个扭曲快慢系数
            float4 offset = tex2D(_NoiseTex,i.uv - _Time.xy * _DistorTimeFactor);
            //用采样的噪声图输出作为下次采样Grab图的偏移值，此处乘以一个扭曲力度的系数
            i.grabPos.xy -=offset.xy * _DistortStrength;
            
           
            
            //根据抓屏位置采样Grab贴图，tex2DProj等同于tex2D(grabPos.xy/grabPos.w),采样点坐标进行了一次投影变换
            fixed4 color = tex2Dproj(_GrabTempTex,i.grabPos);
            //输出颜色的反像
            return color;
            }
            
            
            ENDCG
        }
        
    }
}
